// redux是一个独立的架构，所以redux的运行不一定要靠react

const { legacy_createStore } = require("redux");

// console.log(redux);
/*
  {
    __DO_NOT_USE__ActionTypes: {
      INIT: '@@redux/INITk.t.p.b.w.e',
      REPLACE: '@@redux/REPLACE0.8.s.5.w.r',
      PROBE_UNKNOWN_ACTION: [Function: PROBE_UNKNOWN_ACTION]
    },
    ! applyMiddleware表示中间件，用来后期处理异步的 -> vuex的actions
    applyMiddleware: [Function: applyMiddleware],
    bindActionCreators: [Function: bindActionCreators],
    ! combineReducers用来做仓库模块化的 -> vuex的modules
    combineReducers: [Function: combineReducers],
    compose: [Function: compose],
    ! createStore一个用于创建仓库的函数, 新版本这个方法被废弃了
    createStore: [Function: createStore],
    ! 改用legacy_createStore
    legacy_createStore: [Function: createStore]
  }
*/

//! 需要一个仓库的初始值
// 唯一数据源
const initState = {
  count: 10,
  name: "tom",
};

//! 需要定义一个修改仓库变量的方法
// reducer就是刚才说的纯函数
/*
  同步
  不能修改入参
  入参相同的时候，出参也要相同
*/
// 里面两个参数，第一个是state，第二个是action对象
// action对象是一个包含type属性(决定要如何修改数据)的一个对象
const reducer = (state = initState, action) => {
  switch (action.type) {
    case "add":
      // 必须return一个对象，去替换之前的state
      return {
        ...state,
        count: state.count + 1,
      };
    case "minus":
      return {
        ...state,
        count: state.count - action.n,
      };
    case "changeName":
      return {
        ...state,
        name: "jerry",
      };
    default:
      return state;
  }
};

// createStore执行是需要至少一个参数的,就是修改仓库数据的reducer函数
const store = legacy_createStore(reducer);
// console.log(store);

/*
  store:
  {
    ! dispatch是用于修改仓库数据的
    dispatch: [Function: dispatch],
    ! 用于订阅仓库数据的改变的
    subscribe: [Function: subscribe],
    ! getState用于获取仓库数据
    getState: [Function: getState],
    replaceReducer: [Function: replaceReducer],
    '@@observable': [Function: observable]
  }
*/

// 获取仓库数据
console.log(store.getState());

// 修改仓库数据
// dispatch需要传入一个对象(action对象)
// 只要执行dispatch，就会触发reducer函数
store.dispatch({ type: "add" });
store.dispatch({ type: "add" });
store.dispatch({ type: "add" });
store.dispatch({ type: "changeName" });
store.dispatch({ type: "minus", n: 10 });
console.log(store.getState());
